/*
 * $Id$
 */
package ua.org.energy.vkek.site.model;

import com.google.appengine.api.datastore.Key;
import ua.org.energy.vkek.site.server.DataIOException;

public abstract class AbstractEntity implements BaseEntity {

    public class EntityPathElementImpl implements EntityPathElement {
        //зачем нужно создание отдельного объекта вместо анонимной реализации интерфеса ?
        // ответ: поскольку в com.google.gson.Gson, http://code.google.com/p/google-gson/
        //именно поля объекта,преобразуются в JSON (http://tools.ietf.org/html/rfc4627)

        private String elName;
        private Key elKey;

        public EntityPathElementImpl(String elName, Key elKey) {
            this.elName = elName;
            this.elKey = elKey;
        }

        @Override
        public String elName() {
            return this.elName;
        }

        @Override
        public Key elKey() {
            return this.elKey;
        }
    }

    /**
     * Предположим у нас есть большое текстовое поле объекта, который мы
     * отправяем пользователю через сеть, при этом,на строне клиента, оно может
     * быть удалено,изменено или оставлено без изменения. Если большое поле
     * оставлено без изменения (другие поля были изменены), то зачем посылать
     * его обратно через сеть ? Можно отослать назад null и в этом случае, в
     * результате этой функции, поле останется прежним. Если поле уже равно
     * null, производится попытка присвоить ему null и выставлен флаг
     * valrequared, то генерируется исключение
     *
     * @param <T>
     * @param oldv старое значение поля
     * @param newv новое значение
     * @param valrequared значение не должно быть null
     * @param badvalues "нехорошие" значения для поля
     * @return новое или старое значение
     * @throws DataIOException
     */
    public static <T> T setFieldWise(final T oldv, final T newv, boolean valrequared, T[] badvalues) throws DataIOException {
        T buf = (newv != null) ? newv : oldv;
        if ((buf == null) && valrequared) {
            throw new DataIOException("this filed could not be null");
        }
        if (badvalues != null) {
            for (int i = 0; i < badvalues.length; i++) {
                if (badvalues[i].equals(buf)) {
                    throw new DataIOException("this filed has a bad value " + buf);
                }
            }
        }
        return buf;
    }
}
